home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / mesa / mesa-aux / src-aux.aos / teapot.c < prev    next >
C/C++ Source or Header  |  2000-02-23  |  8KB  |  296 lines

  1. /*
  2.  * teapot.c 
  3.  */
  4.  
  5. #include <GL/gl.h>
  6. #include <GL/glaux.h>
  7.  
  8. /*
  9.  * Rim, body, lid, and bottom data must be reflected in x and y; 
  10.  * * handle and spout data across the y axis only.
  11.  */
  12.  
  13. static const long patchdata[][16] =
  14. {
  15.   {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},           /* rim */
  16.   {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27},           /* body */
  17.   {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40},           /* body */
  18.   {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101, 101, 0, 1, 2, 3,},           /* lid */
  19.   {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117},    /* lid */
  20.   {118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120, 40, 39, 38, 37},/* bottom */
  21.   {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56},           /* handle */
  22.   {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 28, 65, 66, 67},           /* handle */
  23.   {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83},           /* spout */
  24.   {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95}           /* spout */
  25. };
  26.  
  27. static const float cpdata[][3] =
  28. {
  29.   {0.2, 0, 2.7},
  30.   {0.2, -0.112, 2.7},
  31.   {0.112, -0.2, 2.7},
  32.   {0, -0.2, 2.7},
  33.   {1.3375, 0, 2.53125},
  34.   {1.3375, -0.749, 2.53125},
  35.   {0.749, -1.3375, 2.53125},
  36.   {0, -1.3375, 2.53125},
  37.   {1.4375, 0, 2.53125},
  38.   {1.4375, -0.805, 2.53125},
  39.   {0.805, -1.4375, 2.53125},
  40.   {0, -1.4375, 2.53125},
  41.   {1.5, 0, 2.4},
  42.   {1.5, -0.84, 2.4},
  43.   {0.84, -1.5, 2.4},
  44.   {0, -1.5, 2.4},
  45.   {1.75, 0, 1.875},
  46.   {1.75, -0.98, 1.875},
  47.   {0.98, -1.75, 1.875},
  48.   {0, -1.75, 1.875},
  49.   {2, 0, 1.35},
  50.   {2, -1.12, 1.35},
  51.   {1.12, -2, 1.35},
  52.   {0, -2, 1.35},
  53.   {2, 0, 0.9},
  54.   {2, -1.12, 0.9},
  55.   {1.12, -2, 0.9},
  56.   {0, -2, 0.9},
  57.   {-2, 0, 0.9},
  58.   {2, 0, 0.45},
  59.   {2, -1.12, 0.45},
  60.   {1.12, -2, 0.45},
  61.   {0, -2, 0.45},
  62.   {1.5, 0, 0.225},
  63.   {1.5, -0.84, 0.225},
  64.   {0.84, -1.5, 0.225},
  65.   {0, -1.5, 0.225},
  66.   {1.5, 0, 0.15},
  67.   {1.5, -0.84, 0.15},
  68.   {0.84, -1.5, 0.15},
  69.   {0, -1.5, 0.15},
  70.   {-1.6, 0, 2.025},
  71.   {-1.6, -0.3, 2.025},
  72.   {-1.5, -0.3, 2.25},
  73.   {-1.5, 0, 2.25},
  74.   {-2.3, 0, 2.025},
  75.   {-2.3, -0.3, 2.025},
  76.   {-2.5, -0.3, 2.25},
  77.   {-2.5, 0, 2.25},
  78.   {-2.7, 0, 2.025},
  79.   {-2.7, -0.3, 2.025},
  80.   {-3, -0.3, 2.25},
  81.   {-3, 0, 2.25},
  82.   {-2.7, 0, 1.8},
  83.   {-2.7, -0.3, 1.8},
  84.   {-3, -0.3, 1.8},
  85.   {-3, 0, 1.8},
  86.   {-2.7, 0, 1.575},
  87.   {-2.7, -0.3, 1.575},
  88.   {-3, -0.3, 1.35},
  89.   {-3, 0, 1.35},
  90.   {-2.5, 0, 1.125},
  91.   {-2.5, -0.3, 1.125},
  92.   {-2.65, -0.3, 0.9375},
  93.   {-2.65, 0, 0.9375},
  94.   {-2, -0.3, 0.9},
  95.   {-1.9, -0.3, 0.6},
  96.   {-1.9, 0, 0.6},
  97.   {1.7, 0, 1.425},
  98.   {1.7, -0.66, 1.425},
  99.   {1.7, -0.66, 0.6},
  100.   {1.7, 0, 0.6},
  101.   {2.6, 0, 1.425},
  102.   {2.6, -0.66, 1.425},
  103.   {3.1, -0.66, 0.825},
  104.   {3.1, 0, 0.825},
  105.   {2.3, 0, 2.1},
  106.   {2.3, -0.25, 2.1},
  107.   {2.4, -0.25, 2.025},
  108.   {2.4, 0, 2.025},
  109.   {2.7, 0, 2.4},
  110.   {2.7, -0.25, 2.4},
  111.   {3.3, -0.25, 2.4},
  112.   {3.3, 0, 2.4},
  113.   {2.8, 0, 2.475},
  114.   {2.8, -0.25, 2.475},
  115.   {3.525, -0.25, 2.49375},
  116.   {3.525, 0, 2.49375},
  117.   {2.9, 0, 2.475},
  118.   {2.9, -0.15, 2.475},
  119.   {3.45, -0.15, 2.5125},
  120.   {3.45, 0, 2.5125},
  121.   {2.8, 0, 2.4},
  122.   {2.8, -0.15, 2.4},
  123.   {3.2, -0.15, 2.4},
  124.   {3.2, 0, 2.4},
  125.   {0, 0, 3.15},
  126.   {0.8, 0, 3.15},
  127.   {0.8, -0.45, 3.15},
  128.   {0.45, -0.8, 3.15},
  129.   {0, -0.8, 3.15},
  130.   {0, 0, 2.85},
  131.   {1.4, 0, 2.4},
  132.   {1.4, -0.784, 2.4},
  133.   {0.784, -1.4, 2.4},
  134.   {0, -1.4, 2.4},
  135.   {0.4, 0, 2.55},
  136.   {0.4, -0.224, 2.55},
  137.   {0.224, -0.4, 2.55},
  138.   {0, -0.4, 2.55},
  139.   {1.3, 0, 2.55},
  140.   {1.3, -0.728, 2.55},
  141.   {0.728, -1.3, 2.55},
  142.   {0, -1.3, 2.55},
  143.   {1.3, 0, 2.4},
  144.   {1.3, -0.728, 2.4},
  145.   {0.728, -1.3, 2.4},
  146.   {0, -1.3, 2.4},
  147.   {0, 0, 0},
  148.   {1.425, -0.798, 0},
  149.   {1.5, 0, 0.075},
  150.   {1.425, 0, 0},
  151.   {0.798, -1.425, 0},
  152.   {0, -1.5, 0.075},
  153.   {0, -1.425, 0},
  154.   {1.5, -0.84, 0.075},
  155.   {0.84, -1.5, 0.075}
  156. };
  157.  
  158. long GRD;
  159.  
  160. #define TEAPOTSOLID 0
  161. #define TEAPOTWIRE 1
  162.  
  163. static GLuint teapots[2] =
  164. {0, 0};
  165.  
  166. static const float tex[2][2][2] =
  167. {
  168.   {
  169.     {0, 0},
  170.     {1, 0}},
  171.   {
  172.     {0, 1},
  173.     {1, 1}}};
  174.  
  175. static void solidTeapot(long grid, GLdouble scale)
  176. {
  177.   float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
  178.   long i, j, k, l;
  179.  
  180.   if (grid < 2)
  181.     grid = 7;
  182.   GRD = grid;
  183.   teapots[TEAPOTSOLID] = glGenLists(1);
  184.   glNewList(teapots[TEAPOTSOLID], GL_COMPILE);
  185.   glPushMatrix();
  186.   glRotatef(270.0, 1.0, 0.0, 0.0);
  187.   glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
  188.   glTranslatef(0.0, 0.0, -1.5);
  189.   for (i = 0; i < 10; i++) {
  190.     for (j = 0; j < 4; j++)
  191.       for (k = 0; k < 4; k++)
  192.     for (l = 0; l < 3; l++) {
  193.       p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
  194.       q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
  195.       if (l == 1)
  196.         q[j][k][l] *= -1.0;
  197.       if (i < 6) {
  198.         r[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
  199.         if (l == 0)
  200.           r[j][k][l] *= -1.0;
  201.         s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
  202.         if (l == 0)
  203.           s[j][k][l] *= -1.0;
  204.         if (l == 1)
  205.           s[j][k][l] *= -1.0;
  206.       }
  207.     }
  208.     glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &tex[0][0][0]);
  209.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0]);
  210.     glEnable(GL_MAP2_VERTEX_3);
  211.     glEnable(GL_MAP2_TEXTURE_COORD_2);
  212.     glMapGrid2f(GRD, 0.0, 1.0, GRD, 0.0, 1.0);
  213.     glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  214.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0]);
  215.     glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  216.     if (i < 6) {
  217.       glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &r[0][0][0]);
  218.       glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  219.       glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &s[0][0][0]);
  220.       glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  221.     }
  222.   }
  223.   glDisable(GL_MAP2_VERTEX_3);
  224.   glDisable(GL_MAP2_TEXTURE_COORD_2);
  225.   glPopMatrix();
  226.   glEndList();
  227. }
  228.  
  229. static void wireTeapot(long grid, GLdouble scale)
  230. {
  231.   float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
  232.   long i, j, k, l;
  233.  
  234.   if (grid < 2)
  235.     grid = 7;
  236.   GRD = grid;
  237.   teapots[TEAPOTWIRE] = glGenLists(1);
  238.   glNewList(teapots[TEAPOTWIRE], GL_COMPILE);
  239.   glPushMatrix();
  240.   glRotatef(270.0, 1.0, 0.0, 0.0);
  241.   glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
  242.   glTranslatef(0.0, 0.0, -1.5);
  243.   for (i = 0; i < 10; i++) {
  244.     for (j = 0; j < 4; j++)
  245.       for (k = 0; k < 4; k++)
  246.     for (l = 0; l < 3; l++) {
  247.       p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
  248.       q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
  249.       if (l == 1)
  250.         q[j][k][l] *= -1.0;
  251.       if (i < 6) {
  252.         r[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
  253.         if (l == 0)
  254.           r[j][k][l] *= -1.0;
  255.         s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
  256.         if (l == 0)
  257.           s[j][k][l] *= -1.0;
  258.         if (l == 1)
  259.           s[j][k][l] *= -1.0;
  260.       }
  261.     }
  262.     glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &tex[0][0][0]);
  263.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0]);
  264.     glEnable(GL_MAP2_VERTEX_3);
  265.     glEnable(GL_MAP2_TEXTURE_COORD_2);
  266.     glMapGrid2f(GRD, 0.0, 1.0, GRD, 0.0, 1.0);
  267.     glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  268.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0]);
  269.     glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  270.     if (i < 6) {
  271.       glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &r[0][0][0]);
  272.       glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  273.       glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &s[0][0][0]);
  274.       glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  275.     }
  276.   }
  277.   glDisable(GL_MAP2_VERTEX_3);
  278.   glDisable(GL_MAP2_TEXTURE_COORD_2);
  279.   glPopMatrix();
  280.   glEndList();
  281. }
  282.  
  283. void auxSolidTeapot(GLdouble scale)
  284. {
  285.   if (glIsList(teapots[TEAPOTSOLID]) == 0)
  286.     solidTeapot(14, scale);
  287.   glCallList(teapots[TEAPOTSOLID]);
  288. }
  289.  
  290. void auxWireTeapot(GLdouble scale)
  291. {
  292.   if (glIsList(teapots[TEAPOTWIRE]) == 0)
  293.     wireTeapot(10, scale);
  294.   glCallList(teapots[TEAPOTWIRE]);
  295. }
  296.